// 数据导出为csv表格
define([
	"libJs/csv.min",
	"publicTool/method",
	"publicTool/ajax",
	"publicBusiness/verifyPermission",
	// "mock/financiaStatistics/adjustRecordList",
], function (CsvLib, Method, ajax, Permission) {
	var Csv = function(opt){
		this.config(opt);
		this.init();
		this.bindExportEvent();
	}

	// 基础项配置
	Csv.prototype.config = function(opt){
		var defaults = {
			ele: "dataExport",//按钮对象
			csvName: "csv导出数据测试",//导出的csv的名称
			disableClass: "disable",//禁用class用于阻止事件的标识
			titleMap: "",//表头映射(将英文字段转换为导出的字段)
			exportBtnId: "dataExportButton",//动态生成导出按钮的id
			apiName: "api_business",//请求的接口项目名称
			url: "",//请求的数据地址
			pageSize: 1000,//导出查询的每页条数
			totalId: "page_total_page",//总条数的元素id(默认来自分页组件的总条数)
			formId: "searchForm",//列表搜索form id
			permission: "",//导出权限标识
		}
		this.config = $.extend({}, defaults, opt);
		
		this.ele = $("#" + this.config.ele);
		this.exportData = [];//从服务器请求回来的数据
		// this.exportData = [{year:2017}];//从服务器请求回来的数据-测试
		this.curPage = null;//前端分页请求当前页
		this.totalPage = null;//前端分页请求总页数
		this.totalEle = null;//总条数的元素id(默认来自分页组件的总条数)
		this.form = $("#" + this.config.formId);
		this.requestFlag = true;//获取导出数据的标识
		this.layerIdx = null;//加载层的动画索引
	}

	// 初始化
	Csv.prototype.init = function(){
		// 本地测试导出csv-送测一定要注释掉
		// this.mockCsvData();
	}

	// Csv导出测试数据模拟
	Csv.prototype.mockCsvData = function(){
		var csvData = [];
    for(var i=0;i<10000;i++){
    	var obj = {};
    	obj.year = "year" + i;
    	obj.name = "name" + i;
    	obj.age = "age" + i;
      csvData.push( obj );  
    }  
    this.exportData = csvData;
	}

	// 导出按钮绑定事件
	Csv.prototype.bindExportEvent = function(){
		var _this = this;
		this.ele.click(function(){
			// 禁用按钮
			if( $(this).hasClass(_this.config.disableClass) ){
				return;
			}
			// 验证数据权限
			if(_this.config.permission){
				if( !Permission.verifyPermission(_this.config.permission) ){
					return;
				}
			}
			// 数据为空
			_this.totalEle = $("#" + _this.config.totalId);
			if( !_this.totalEle.length || _this.totalEle.html() == 0 ){
				return;
			}
			_this.exportEvent();
		});
	}

	// 导出事件交互
	Csv.prototype.exportEvent = function(){
		// 加载动画
		this.exportAnimation();
		this.getExportData();
	}

	// 获取导出数据
	Csv.prototype.getExportData = function () {
		var iTotal = parseInt( this.totalEle.html() );
		this.curPage = 1;
		this.totalPage = Math.ceil(iTotal/this.config.pageSize);
		this.ajaxRequest();
	}

	// 获取导出数据的ajax请求方法
	Csv.prototype.ajaxRequest = function(){
		var _this = this;
		var oData = Method.unserialize( decodeURIComponent( this.form.serialize().replace(/\+/g, '%20') ) );
		oData["page_infos][curr_page"] = _this.curPage;
		oData["page_infos][page_size"] = _this.config.pageSize;
		// 增加导出权限
		if(_this.config.permission){
			if(oData["conditions][identification"]){
				oData["conditions][identification"] = _this.config.permission;
			}
		}else{
			if(oData["conditions][identification"]){
				oData["conditions][identification"] = "";
			}
		}
		ajax({
			data: {
				isShowLoading: false,
				api_name: _this.config.apiName,
				uri: _this.config.url,
				data: oData
			}
		}, function(data){
			_this.curPage++;
			for(var i = 0; i < data.result.data.length; i++){
				_this.exportData.push(data.result.data[i]);
			}
			if(_this.curPage > _this.totalPage){
				layer.closeAll();
				if(_this.exportData.length){
					_this.makeExportFile( _this.resolveExportData( _this.exportData ) );
					_this.exportData = [];
				}
			}else{
				_this.ajaxRequest();
			}
		}, function(){
			layer.close(_this.layerIdx);
			if(_this.exportData.length){
				_this.makeExportFile( _this.resolveExportData( _this.exportData ) );
				_this.exportData = [];
			}
		});
	}

	// 处理获得的数据
	// 参数一 要处理的数据 结构必须为 objectArray [{key1: val1, key2: val2},{key1: val1, key2: val2}]
	Csv.prototype.resolveExportData = function(aData){
		var _this = this;
		var aSolveData = [];
		$(aData).each(function(idx, val){
			var oData = {};
			for(var i in _this.config.titleMap){
				// 判断传过来的参数是否是想在对象或者数字取值
				if(typeof _this.config.titleMap[i] === "object"){
					for(var j in _this.config.titleMap[i]){
						oData[ _this.config.titleMap[i][j] ] = val[i][j];
					}
				}else{
					oData[ _this.config.titleMap[i] ] = val[i];
				}
			}
			aSolveData.push(oData);
		});
		return aSolveData;
	}

	// 生成csv文件并导出
	// 参数一 生成表格对应的数据
	Csv.prototype.makeExportFile = function(aData){
		var str = new CsvLib( aData, { header: true }).encode();
    // str = encodeURIComponent(str);
    // 执行真正的下载
    this.downloadFile(str);
	}

	// 导出加载动画
	// 参数一 iTplType [动画类型 目前只有默认的如果不能满足可以自行添加]
	Csv.prototype.exportAnimation = function(iTplType){
		var sTpl = ""; //模板字符串值

		switch(iTplType){
			case 1:
				sTpl = "123";
				break;
			default:
				sTpl = '<div class="loading_zone">' +
							'<div class="loading_img"></div>' +
							'<p>数据正在导出，请您耐心等待</p>' +
						'</div>';
		};

		this.layerIdx = layer.open({
			title: "",
			shadeClose: false,
			closeBtn: 0,
			btn: [],
			content: sTpl,
			skin: "loading_style",
			area: ["386px", "256px"]
		});
	}

	// 执行真正的下载
	// 参数一 dataSting csv插件最终生成的数据字符串
	Csv.prototype.downloadFile = function(dataSting){
		// 将文本转为二进制
		var blob = new Blob(["\ufeff" + dataSting], {type: "text/csv;chartset=GBK"});
		$("body").append("<a id="+ this.config.exportBtnId +"></a>");
		$("#" + this.config.exportBtnId).attr("download", this.config.csvName + ".csv");
		$("#" + this.config.exportBtnId).attr("href", URL.createObjectURL(blob) );
		$("#" + this.config.exportBtnId).get(0).click();
		$("#" + this.config.exportBtnId).remove();
	}

	// 判断是否存在disable属性
	Csv.prototype.hasDisableClass = function(){
		return this.ele.hasClass( this.config.disableClass );
	}

	// 设置导出按钮的禁用状态
	// 参数一 bBoo 判断是添加class、移除class false->添加 true->移除
	Csv.prototype.setBtnDisbale = function(bBoo){
		if(bBoo){
			this.ele.removeClass(this.config.disableClass);
		}else{
			this.ele.addClass(this.config.disableClass);
		}
	}

	return Csv;
})